/*
 * @(#)Method.java $version 2010. 8. 11
 *
 * Copyright 2007-2010 NHN Corp. All rights Reserved. 
 * NHN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 */
package com.nhncorp.usf.core.config.runtime;

import java.util.ArrayList;
import java.util.List;

import com.nhncorp.usf.core.service.ServiceType;

/**
 * Business 수행을 위한 Method 정보.
 *
 * @author Web Platform Development Team.
 */
public class Method extends ServiceImpl implements Service {
    /**
     * 메소드 이름
     */
    private String name;

    /**
     * Method 결과를 담을 변수명을 의미하는 구분자명( 타입은 Object 로 제한이 없음)
     */
    private String returnId;

    /**
     * 메소드에 전달할 파라미터를 Map의 형태로 전달할 것인지 구분
     */
    private boolean isParameterMap;

    /**
     * 메소드 수행 결과의 캐싱 여부
     */
    private boolean useCache;

    /**
     * 캐싱할 결과값의 만료 시간
     */
    private int expire;

    /**
     * Method 실행중 Error 가 발생 했을 때 Exception 을 던질지 Ignore 할지 여부
     * */
    private boolean isIgnoreException;
    
    /**
     * 메소드 수행을 위해 전달될 {@link ParameterInfo} 리스트.
     */
    private List<ParameterInfo> parameters = new ArrayList<ParameterInfo>();

    private boolean controlBlock = false;

    private List<ScriptInfo> preScriptInfo = new ArrayList<ScriptInfo>();
    private List<ScriptInfo> postScriptInfo = new ArrayList<ScriptInfo>();


    /**
     * 생성자
     */
    public Method(String name, String returnId) {
        this.name = name;
        this.returnId = returnId;
    }

    /**
     * 메소드 이름 반환.
     *
     * @return the method name
     */
    public String getName() {
        return this.name;
    }

    /**
     * Method 결과를 담을 변수명을 의미하는 구분자명 반환.
     *
     * @return the result name
     */
    public String getReturnId() {
        return this.returnId;
    }

    /**
     * Checks if is parameter map.
     *
     * @return true, if is parameter map
     */
    public boolean getIsParameterMap() {
        return isParameterMap;
    }

    /**
     * Sets the parameter map.
     *
     * @param isParameterMap the new parameter map
     */
    public void setIsParameterMap(boolean isParameterMap) {
        this.isParameterMap = isParameterMap;
    }

    /**
     * {@link ParameterInfo} 추가.
     *
     * @param parameterInfo the parameter information
     */
    public void addParameterInfo(ParameterInfo parameterInfo) {
        this.parameters.add(parameterInfo);
    }

    /**
     * {@link ParameterInfo} {@link List} 반환.
     *
     * @return the parameter information
     */
    public List<ParameterInfo> getParameterInfos() {
        return this.parameters;
    }

    /**
     * @return the control block exist or don't exist in method
     */
    public boolean isControlBlock() {
        return controlBlock;
    }

    /**
     * @param controllable control block exist or don't exist in method
     */
    public void setControlBlock(boolean controllable) {
        this.controlBlock = controllable;
    }

    /**
     * Adds the script info.
     *
     * @param scriptInfo the script info
     */
    public void addScriptInfo(ScriptInfo scriptInfo) {
        String callType = scriptInfo.getCallType();

        if (callType.equals(ScriptEngineGlobals.SCRIPT_CALL_TYPE_PRE)) {
            this.preScriptInfo.add(scriptInfo);
        } else if (callType.equals(ScriptEngineGlobals.SCRIPT_CALL_TYPE_POST)) {
            this.postScriptInfo.add(scriptInfo);
        }
    }

    /**
     * Gets the pre script list.
     *
     * @return the pre script list
     */
    public List<ScriptInfo> getPreScriptList() {
        return this.preScriptInfo;
    }

    /**
     * Gets the post script list.
     *
     * @return the post script list
     */
    public List<ScriptInfo> getPostScriptList() {
        return this.postScriptInfo;
    }

    /**
     * Checks if is use cache.
     *
     * @return true, if is use cache
     */
    public boolean isUseCache() {
        return useCache;
    }

    /**
     * Sets the use cache.
     *
     * @param useCache the new use cache
     */
    public void setUseCache(boolean useCache) {
        this.useCache = useCache;
    }

    /**
     * Gets the expire.
     *
     * @return the expire
     */
    public int getExpire() {
        return expire;
    }

    /**
     * Sets the expire.
     *
     * @param expire the new expire
     */
    public void setExpire(int expire) {
        this.expire = expire;
    }

	@Override
	public ServiceType getServiceType() {
		return ServiceType.method;
	}

	/**
	 * @return Method 실행 중 Exception 이 발생하면 Ignore 할 지 여부
	 * */
	public boolean getIsIgnoreException() {
		return isIgnoreException;
	}

	/**
	 * @param isIgnoreException Method 실행 중 Exception 이 발생하면 Ignore 할 지 여부
	 * */
	public void setIsIgnoreException(boolean isIgnoreException) {
		this.isIgnoreException = isIgnoreException;
	}

}
